#include "flow.h"

Flow::Flow(double intensity, double invL, QObject *parent) :
  QObject(parent),
  lambda(intensity),
  invLen(invL) {
  // инициализация потока
  genNewMessageTime(0);
  genNewMessageSize();
}

// Выдать время появления текущего сообщения
// постусловие: время должно быть не отрицательным
double Flow::messageTime() {
  if ( t < 0.0 ) // проверка постусловия
    error("Flow::messageTime(): время не положительно.");

  return t;
}

// Сформировать время появления нового сообщения
// постусловие: время должно быть не отрицательным
void Flow::genNewMessageTime(double time) {
  t = time + (1.0/lambda) * ln(1.0/ ran());

  if ( t < 0.0 ) // проверка постусловия
    error("Flow::genNewMessageTime(): время не положительно.");
}

// Выдать текущий размер сообщения
// постусловие: длина сообщения должна быть положительной
double Flow::messageSize() {
  if ( len <= 0.0 ) // проверка постусловия
    error("Flow::messageSize(): длина сообщения не положительна.");

  return len;
}

// Сформировать новый размер сообщения
// постусловие: длина сообщения должна быть положительной
void Flow::genNewMessageSize() {
  len = (1.0/invLen) * ln(1.0/ ran());

  if ( len <= 0.0 ) // проверка постусловия
    error("Flow::genNewMessageSize(): длина сообщения не положительна.");
}

// Назначить среднюю длину сообщения
// пердусловие: средняя длина сообщения должна быть положительной
void Flow::setInvLen(double invLength) {
  if ( invLength <= 0.0 ) // проверка предусловия
    error("Flow::setInvLen(): получена не положительная средняя длина сообщения.");

  invLen = invLength;
}

// Назначить интенсивность
// предусловие: интенсивность должна быть положительной
void Flow::setIntensity(double intensity) {
  if ( intensity <= 0.0 ) // проверка предуловия
    error("Flow::setIntensity(): получена не положительная интенсивность.");

  lambda = intensity;
}
